home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume24 / gnucalc / part16 < prev    next >
Encoding:
Text File  |  1991-10-29  |  55.2 KB  |  1,785 lines

  1. Newsgroups: comp.sources.misc
  2. From: daveg@synaptics.com (David Gillespie)
  3. Subject:  v24i064:  gnucalc - GNU Emacs Calculator, v2.00, Part16/56
  4. Message-ID: <1991Oct29.230323.20566@sparky.imd.sterling.com>
  5. X-Md4-Signature: ca3abfce3d6b5a9e4d3e498bd6dbb96d
  6. Date: Tue, 29 Oct 1991 23:03:23 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: daveg@synaptics.com (David Gillespie)
  10. Posting-number: Volume 24, Issue 64
  11. Archive-name: gnucalc/part16
  12. Environment: Emacs
  13. Supersedes: gmcalc: Volume 13, Issue 27-45
  14.  
  15. ---- Cut Here and unpack ----
  16. #!/bin/sh
  17. # do not concatenate these parts, unpack them in order with /bin/sh
  18. # file calc-forms.el continued
  19. #
  20. if test ! -r _shar_seq_.tmp; then
  21.     echo 'Please unpack part 1 first!'
  22.     exit 1
  23. fi
  24. (read Scheck
  25.  if test "$Scheck" != 16; then
  26.     echo Please unpack part "$Scheck" next!
  27.     exit 1
  28.  else
  29.     exit 0
  30.  fi
  31. ) < _shar_seq_.tmp || exit 1
  32. if test ! -f _shar_wnt_.tmp; then
  33.     echo 'x - still skipping calc-forms.el'
  34. else
  35. echo 'x - continuing file calc-forms.el'
  36. sed 's/^X//' << 'SHAR_EOF' >> 'calc-forms.el' &&
  37. X  (if (or (< day 1) (> day (math-days-in-month year month)))
  38. X      (throw 'syntax "Day value is out of range"))
  39. X  (and hour
  40. X       (progn
  41. X     (if (or (< hour 0) (> hour 23))
  42. X         (throw 'syntax "Hour value is out of range"))
  43. X     (if (or (< minute 0) (> minute 59))
  44. X         (throw 'syntax "Minute value is out of range"))
  45. X     (if (or (math-negp second) (not (Math-lessp second 60)))
  46. X         (throw 'syntax "Seconds value is out of range"))))
  47. X  (list 'date (math-dt-to-date (append (list year month day)
  48. X                       (and hour (list hour minute second)))))
  49. )
  50. X
  51. (defun math-parse-date-word (names &optional front)
  52. X  (let ((n 1))
  53. X    (while (and names (not (string-match (if (equal (car names) "Sep")
  54. X                         "Sept?"
  55. X                       (regexp-quote (car names)))
  56. X                     str)))
  57. X      (setq names (cdr names)
  58. X        n (1+ n)))
  59. X    (and names
  60. X     (or (not front) (= (match-beginning 0) 0))
  61. X     (progn
  62. X       (setq str (concat (substring str 0 (match-beginning 0))
  63. X                 (if front "" " ")
  64. X                 (substring str (match-end 0))))
  65. X       n)))
  66. )
  67. X
  68. (defun math-parse-standard-date (str with-time)
  69. X  (let ((case-fold-search t)
  70. X    (okay t) num
  71. X    (fmt calc-date-format) this next (gnext nil)
  72. X    (year nil) (month nil) (day nil) (bigyear nil) (yearday nil)
  73. X    (hour nil) (minute nil) (second nil) (bc-flag nil))
  74. X    (while (and fmt okay)
  75. X      (setq this (car fmt)
  76. X        fmt (setq fmt (or (cdr fmt)
  77. X                (prog1
  78. X                    gnext
  79. X                  (setq gnext nil))))
  80. X        next (car fmt))
  81. X      (if (consp next) (setq next (car next)))
  82. X      (or (cond ((listp this)
  83. X         (or (not with-time)
  84. X             (not this)
  85. X             (setq gnext fmt
  86. X               fmt this)))
  87. X        ((stringp this)
  88. X         (if (and (<= (length this) (length str))
  89. X              (equal this
  90. X                 (substring str 0 (length this))))
  91. X             (setq str (substring str (length this)))))
  92. X        ((eq this 'X)
  93. X         t)
  94. X        ((memq this '(n N j J))
  95. X         (and (string-match "\\`[-+]?[0-9.]+\\([eE][-+]?[0-9]+\\)?" str)
  96. X              (setq num (math-match-substring str 0)
  97. X                str (substring str (match-end 0))
  98. X                num (math-date-to-dt (math-read-number num))
  99. X                num (math-sub num
  100. X                      (if (memq this '(n N))
  101. X                          0
  102. X                        (if (or (eq this 'j)
  103. X                            (math-integerp num))
  104. X                        '(bigpos 424 721 1)
  105. X                          '(float (bigpos 235 214 17)
  106. X                              -1))))
  107. X                hour (or (nth 3 num) hour)
  108. X                minute (or (nth 4 num) minute)
  109. X                second (or (nth 5 num) second)
  110. X                year (car num)
  111. X                month (nth 1 num)
  112. X                day (nth 2 num))))
  113. X        ((eq this 'U)
  114. X         (and (string-match "\\`[-+]?[0-9]+" str)
  115. X              (setq num (math-match-substring str 0)
  116. X                str (substring str (match-end 0))
  117. X                num (math-date-to-dt
  118. X                 (math-add 719164
  119. X                       (math-div (math-read-number num)
  120. X                             '(float 864 2))))
  121. X                hour (nth 3 num)
  122. X                minute (nth 4 num)
  123. X                second (nth 5 num)
  124. X                year (car num)
  125. X                month (nth 1 num)
  126. X                day (nth 2 num))))
  127. X        ((memq this '(Mmm MMM))
  128. X         (setq month (math-parse-date-word math-short-month-names t)))
  129. X        ((memq this '(Mmmm MMMM))
  130. X         (setq month (math-parse-date-word math-long-month-names t)))
  131. X        ((memq this '(Www WWW))
  132. X         (math-parse-date-word math-short-weekday-names t))
  133. X        ((memq this '(Wwww WWWW))
  134. X         (math-parse-date-word math-long-weekday-names t))
  135. X        ((memq this '(p P))
  136. X         (if (string-match "\\`a" str)
  137. X             (setq hour (if (= hour 12) 0 hour)
  138. X               str (substring str 1))
  139. X           (if (string-match "\\`p" str)
  140. X               (setq hour (if (= hour 12) 12 (% (+ hour 12) 24))
  141. X                 str (substring str 1)))))
  142. X        ((memq this '(pp PP pppp PPPP))
  143. X         (if (string-match "\\`am\\|a\\.m\\." str)
  144. X             (setq hour (if (= hour 12) 0 hour)
  145. X               str (substring str (match-end 0)))
  146. X           (if (string-match "\\`pm\\|p\\.m\\." str)
  147. X               (setq hour (if (= hour 12) 12 (% (+ hour 12) 24))
  148. X                 str (substring str (match-end 0))))))
  149. X        ((memq this '(Y YY BY YYY YYYY))
  150. X         (and (if (memq next '(MM DD ddd hh HH mm ss SS))
  151. X              (if (memq this '(Y YY BYY))
  152. X                  (string-match "\\` *[0-9][0-9]" str)
  153. X                (string-match "\\`[0-9][0-9][0-9][0-9]" str))
  154. X            (string-match "\\`[-+]?[0-9]+" str))
  155. X              (setq year (math-match-substring str 0)
  156. X                bigyear (or (eq this 'YYY)
  157. X                    (memq (aref str 0) '(?\+ ?\-)))
  158. X                str (substring str (match-end 0))
  159. X                year (math-read-number year))))
  160. X        ((eq this 'b)
  161. X         t)
  162. X        ((memq this '(aa AA aaaa AAAA))
  163. X         (if (string-match "\\` *\\(ad\\|a\\.d\\.\\)" str)
  164. X             (setq str (substring str (match-end 0)))))
  165. X        ((memq this '(aaa AAA))
  166. X         (if (string-match "\\` *ad *" str)
  167. X             (setq str (substring str (match-end 0)))))
  168. X        ((memq this '(bb BB bbb BBB bbbb BBBB))
  169. X         (if (string-match "\\` *\\(bc\\|b\\.c\\.\\)" str)
  170. X             (setq str (substring str (match-end 0))
  171. X               bc-flag t)))
  172. X        ((memq this '(s ss bs SS BS))
  173. X         (and (if (memq next '(YY YYYY MM DD hh HH mm))
  174. X              (string-match "\\` *[0-9][0-9]\\(\\.[0-9]+\\)?" str)
  175. X            (string-match "\\` *[0-9][0-9]?\\(\\.[0-9]+\\)?" str))
  176. X              (setq second (math-match-substring str 0)
  177. X                str (substring str (match-end 0))
  178. X                second (math-read-number second))))
  179. X        ((eq this 'C)
  180. X         (if (string-match "\\`:[0-9][0-9]" str)
  181. X             (setq str (substring str 1))
  182. X           t))
  183. X        ((or (not (if (and (memq this '(ddd MM DD hh HH mm))
  184. X                   (memq next '(YY YYYY MM DD ddd
  185. X                           hh HH mm ss SS)))
  186. X                  (if (eq this 'ddd)
  187. X                  (string-match "\\` *[0-9][0-9][0-9]" str)
  188. X                (string-match "\\` *[0-9][0-9]" str))
  189. X                (string-match "\\` *[0-9]+" str)))
  190. X             (and (setq num (string-to-int
  191. X                     (math-match-substring str 0))
  192. X                str (substring str (match-end 0)))
  193. X              nil))
  194. X         nil)
  195. X        ((eq this 'W)
  196. X         (and (>= num 0) (< num 7)))
  197. X        ((memq this '(d ddd bdd))
  198. X         (setq yearday num))
  199. X        ((memq this '(M MM BM))
  200. X         (setq month num))
  201. X        ((memq this '(D DD BD))
  202. X         (setq day num))
  203. X        ((memq this '(h hh bh H HH BH))
  204. X         (setq hour num))
  205. X        ((memq this '(m mm bm))
  206. X         (setq minute num)))
  207. X      (setq okay nil)))
  208. X    (if yearday
  209. X    (if (and month day)
  210. X        (setq yearday nil)
  211. X      (setq month 1 day 1)))
  212. X    (if (and okay (equal str ""))
  213. X    (and month day (or (not (or hour minute second))
  214. X               (and hour minute))
  215. X         (progn
  216. X           (or year (setq year (math-this-year)))
  217. X           (or second (setq second 0))
  218. X           (if bc-flag
  219. X           (setq year (math-neg (math-abs year))))
  220. X           (setq day (math-parse-date-validate year bigyear month day
  221. X                           hour minute second))
  222. X           (if yearday
  223. X           (setq day (math-add day (1- yearday))))
  224. X           day))))
  225. )
  226. X
  227. X
  228. (defun calcFunc-now (&optional zone)
  229. X  (let ((date (let ((calc-date-format nil))
  230. X        (math-parse-date (current-time-string)))))
  231. X    (if (consp date)
  232. X    (if zone
  233. X        (math-add date (math-div (math-sub (calcFunc-tzone nil date)
  234. X                           (calcFunc-tzone zone date))
  235. X                     '(float 864 2)))
  236. X      date)
  237. X      (calc-record-why "*Unable to interpret current date from system")
  238. X      (append (list 'calcFunc-now) (and zone (list zone)))))
  239. )
  240. X
  241. (defun calcFunc-year (date)
  242. X  (car (math-date-to-dt date))
  243. )
  244. X
  245. (defun calcFunc-month (date)
  246. X  (nth 1 (math-date-to-dt date))
  247. )
  248. X
  249. (defun calcFunc-day (date)
  250. X  (nth 2 (math-date-to-dt date))
  251. )
  252. X
  253. (defun calcFunc-weekday (date)
  254. X  (if (eq (car-safe date) 'date)
  255. X      (setq date (nth 1 date)))
  256. X  (or (math-realp date)
  257. X      (math-reject-arg date 'datep))
  258. X  (math-mod (math-add (math-floor date) 6) 7)
  259. )
  260. X
  261. (defun calcFunc-yearday (date)
  262. X  (let ((dt (math-date-to-dt date)))
  263. X    (math-day-number (car dt) (nth 1 dt) (nth 2 dt)))
  264. )
  265. X
  266. (defun calcFunc-hour (date)
  267. X  (if (eq (car-safe date) 'hms)
  268. X      (nth 1 date)
  269. X    (or (nth 3 (math-date-to-dt date)) 0))
  270. )
  271. X
  272. (defun calcFunc-minute (date)
  273. X  (if (eq (car-safe date) 'hms)
  274. X      (nth 2 date)
  275. X    (or (nth 4 (math-date-to-dt date)) 0))
  276. )
  277. X
  278. (defun calcFunc-second (date)
  279. X  (if (eq (car-safe date) 'hms)
  280. X      (nth 3 date)
  281. X    (or (nth 5 (math-date-to-dt date)) 0))
  282. )
  283. X
  284. (defun calcFunc-time (date)
  285. X  (let ((dt (math-date-to-dt date)))
  286. X    (if (nth 3 dt)
  287. X    (cons 'hms (nthcdr 3 dt))
  288. X      (list 'hms 0 0 0)))
  289. )
  290. X
  291. (defun calcFunc-date (date &optional month day hour minute second)
  292. X  (and (math-messy-integerp month) (setq month (math-trunc month)))
  293. X  (and month (not (integerp month)) (math-reject-arg month 'fixnump))
  294. X  (and (math-messy-integerp day) (setq day (math-trunc day)))
  295. X  (and day (not (integerp day)) (math-reject-arg day 'fixnump))
  296. X  (if (and (eq (car-safe hour) 'hms) (not minute))
  297. X      (setq second (nth 3 hour)
  298. X        minute (nth 2 hour)
  299. X        hour (nth 1 hour)))
  300. X  (and (math-messy-integerp hour) (setq hour (math-trunc hour)))
  301. X  (and hour (not (integerp hour)) (math-reject-arg hour 'fixnump))
  302. X  (and (math-messy-integerp minute) (setq minute (math-trunc minute)))
  303. X  (and minute (not (integerp minute)) (math-reject-arg minute 'fixnump))
  304. X  (and (math-messy-integerp second) (setq second (math-trunc second)))
  305. X  (and second (not (math-realp second)) (math-reject-arg second 'realp))
  306. X  (if month
  307. X      (progn
  308. X    (and (math-messy-integerp date) (setq date (math-trunc date)))
  309. X    (and date (not (math-integerp date)) (math-reject-arg date 'integerp))
  310. X    (if day
  311. X        (if hour
  312. X        (list 'date (math-dt-to-date (list date month day hour
  313. X                           (or minute 0)
  314. X                           (or second 0))))
  315. X          (list 'date (math-dt-to-date (list date month day))))
  316. X      (list 'date (math-dt-to-date (list (math-this-year) date month)))))
  317. X    (if (math-realp date)
  318. X    (list 'date date)
  319. X      (if (eq (car date) 'date)
  320. X      (nth 1 date)
  321. X    (math-reject-arg date 'datep))))
  322. )
  323. X
  324. (defun calcFunc-julian (date &optional zone)
  325. X  (if (math-realp date)
  326. X      (list 'date (if (math-integerp date)
  327. X              (math-sub date '(bigpos 424 721 1))
  328. X            (setq date (math-sub date '(float (bigpos 235 214 17) -1)))
  329. X            (math-sub date (math-div (calcFunc-tzone zone date)
  330. X                         '(float 864 2)))))
  331. X    (if (eq (car date) 'date)
  332. X    (math-add (nth 1 date) (if (math-integerp (nth 1 date))
  333. X                   '(bigpos 424 721 1)
  334. X                 (math-add '(float (bigpos 235 214 17) -1)
  335. X                       (math-div (calcFunc-tzone zone date)
  336. X                             '(float 864 2)))))
  337. X      (math-reject-arg date 'datep)))
  338. )
  339. X
  340. (defun calcFunc-unixtime (date &optional zone)
  341. X  (if (math-realp date)
  342. X      (progn
  343. X    (setq date (math-add 719164 (math-div date '(float 864 2))))
  344. X    (list 'date (math-sub date (math-div (calcFunc-tzone zone date)
  345. X                         '(float 864 2)))))
  346. X    (if (eq (car date) 'date)
  347. X    (math-add (nth 1 (math-date-parts (nth 1 date) 719164))
  348. X          (calcFunc-tzone zone date))
  349. X      (math-reject-arg date 'datep)))
  350. )
  351. X
  352. (defun calcFunc-tzone (&optional zone date)
  353. X  (if zone
  354. X      (cond ((math-realp zone)
  355. X         (math-round (math-mul zone 3600)))
  356. X        ((eq (car zone) 'hms)
  357. X         (math-round (math-mul (math-from-hms zone 'deg) 3600)))
  358. X        ((eq (car zone) '+)
  359. X         (math-add (calcFunc-tzone (nth 1 zone) date)
  360. X               (calcFunc-tzone (nth 2 zone) date)))
  361. X        ((eq (car zone) '-)
  362. X         (math-sub (calcFunc-tzone (nth 1 zone) date)
  363. X               (calcFunc-tzone (nth 2 zone) date)))
  364. X        ((eq (car zone) 'var)
  365. X         (let ((name (upcase (symbol-name (nth 1 zone))))
  366. X           found)
  367. X           (if (setq found (assoc name math-tzone-names))
  368. X           (calcFunc-tzone (math-add (nth 1 found)
  369. X                         (if (integerp (nth 2 found))
  370. X                         (nth 2 found)
  371. X                           (or
  372. X                        (math-daylight-savings-adjust
  373. X                         date (car found))
  374. X                        0)))
  375. X                   date)
  376. X         (if (equal name "LOCAL")
  377. X             (calcFunc-tzone nil date)
  378. X           (math-reject-arg zone "*Unrecognized time zone name")))))
  379. X        (t (math-reject-arg zone "*Expected a time zone")))
  380. X    (if (calc-var-value 'var-TimeZone)
  381. X    (calcFunc-tzone (calc-var-value 'var-TimeZone) date)
  382. X      (let ((p math-tzone-names)
  383. X        (offset 0)
  384. X        (tz '(var error var-error)))
  385. X    (save-excursion
  386. X      (set-buffer (get-buffer-create " *Calc Temporary*"))
  387. X      (erase-buffer)
  388. X      (call-process "date" nil t)
  389. X      (goto-char 1)
  390. X      (let ((case-fold-search t))
  391. X        (while (and p (not (search-forward (car (car p)) nil t)))
  392. X          (setq p (cdr p))))
  393. X      (if (looking-at "\\([-+][0-9]?[0-9]\\)\\([0-9][0-9]\\)?\\(\\'\\|[^0-9]\\)")
  394. X          (setq offset (math-add
  395. X                (string-to-int (buffer-substring
  396. X                        (match-beginning 1)
  397. X                        (match-end 1)))
  398. X                (if (match-beginning 2)
  399. X                (math-div (string-to-int (buffer-substring
  400. X                              (match-beginning 2)
  401. X                              (match-end 2)))
  402. X                      60)
  403. X                  0)))))
  404. X    (if p
  405. X        (progn
  406. X          (setq p (car p))
  407. X          ;; Try to convert to a generalized time zone.
  408. X          (if (integerp (nth 2 p))
  409. X          (let ((gen math-tzone-names))
  410. X            (while (and gen
  411. X                (not (equal (nth 2 (car gen)) (car p)))
  412. X                (not (equal (nth 3 (car gen)) (car p)))
  413. X                (not (equal (nth 4 (car gen)) (car p)))
  414. X                (not (equal (nth 5 (car gen)) (car p))))
  415. X              (setq gen (cdr gen)))
  416. X            (and gen
  417. X             (setq gen (car gen))
  418. X             (equal (math-daylight-savings-adjust nil (car gen))
  419. X                (nth 2 p))
  420. X             (setq p gen))))
  421. X          (setq tz (math-add (list 'var
  422. X                       (intern (car p))
  423. X                       (intern (concat "var-" (car p))))
  424. X                 offset))))
  425. X    (kill-buffer " *Calc Temporary*")
  426. X    (setq var-TimeZone tz)
  427. X    (calc-refresh-evaltos 'var-TimeZone)
  428. X    (calcFunc-tzone tz date))))
  429. )
  430. X
  431. ;;; Note: Longer names must appear before shorter names which are
  432. ;;;       substrings of them.
  433. (defvar math-tzone-names
  434. X  '( ( "MEGT" -1 "MET" "METDST" )                          ; Middle Europe
  435. X     ( "METDST" -1 -1 ) ( "MET" -1 0 )
  436. X     ( "MEGZ" -1 "MEZ" "MESZ" ) ( "MEZ" -1 0 ) ( "MESZ" -1 -1 )
  437. X     ( "WEGT" 0 "WET" "WETDST" )                           ; Western Europe
  438. X     ( "WETDST" 0 -1 ) ( "WET" 0 0 )
  439. X     ( "BGT" 0 "GMT" "BST" ) ( "GMT" 0 0 ) ( "BST" 0 -1 )  ; Britain
  440. X     ( "NGT" (float 35 -1) "NST" "NDT" )                   ; Newfoundland
  441. X     ( "NST" (float 35 -1) 0 ) ( "NDT" (float 35 -1) -1 )
  442. X     ( "AGT" 4 "AST" "ADT" ) ( "AST" 4 0 ) ( "ADT" 4 -1 )  ; Atlantic
  443. X     ( "EGT" 5 "EST" "EDT" ) ( "EST" 5 0 ) ( "EDT" 5 -1 )  ; Eastern
  444. X     ( "CGT" 6 "CST" "CDT" ) ( "CST" 6 0 ) ( "CDT" 6 -1 )  ; Central
  445. X     ( "MGT" 7 "MST" "MDT" ) ( "MST" 7 0 ) ( "MDT" 7 -1 )  ; Mountain
  446. X     ( "PGT" 8 "PST" "PDT" ) ( "PST" 8 0 ) ( "PDT" 8 -1 )  ; Pacific
  447. X     ( "YGT" 9 "YST" "YDT" ) ( "YST" 9 0 ) ( "YDT" 9 -1 )  ; Yukon
  448. ))
  449. X
  450. X
  451. (defun math-daylight-savings-adjust (date zone &optional dt)
  452. X  (or date (setq date (nth 1 (calcFunc-now))))
  453. X  (let (bump)
  454. X    (if (eq (car-safe date) 'date)
  455. X    (setq bump 0
  456. X          date (nth 1 date))
  457. X      (if (and date (math-realp date))
  458. X      (let ((zadj (assoc zone math-tzone-names)))
  459. X        (if zadj (setq bump -1
  460. X               date (math-sub date (math-div (nth 1 zadj)
  461. X                             '(float 24 0))))))
  462. X    (math-reject-arg date 'datep)))
  463. X    (setq date (math-float date))
  464. X    (or dt (setq dt (math-date-to-dt date)))
  465. X    (and math-daylight-savings-hook
  466. X     (funcall math-daylight-savings-hook date dt zone bump)))
  467. )
  468. X
  469. (defun calcFunc-dsadj (date &optional zone)
  470. X  (if zone
  471. X      (or (eq (car-safe zone) 'var)
  472. X      (math-reject-arg zone "*Time zone variable expected"))
  473. X    (setq zone (or (calc-var-value 'var-TimeZone)
  474. X           (progn
  475. X             (calcFunc-tzone)
  476. X             (calc-var-value 'var-TimeZone)))))
  477. X  (setq zone (and (eq (car-safe zone) 'var)
  478. X          (upcase (symbol-name (nth 1 zone)))))
  479. X  (let ((zadj (assoc zone math-tzone-names)))
  480. X    (or zadj (math-reject-arg zone "*Unrecognized time zone name"))
  481. X    (if (integerp (nth 2 zadj))
  482. X    (nth 2 zadj)
  483. X      (math-daylight-savings-adjust date zone)))
  484. )
  485. X
  486. (defun calcFunc-tzconv (date z1 z2)
  487. X  (if (math-realp date)
  488. X      (nth 1 (calcFunc-tzconv (list 'date date) z1 z2))
  489. X    (calcFunc-unixtime (calcFunc-unixtime date z1) z2))
  490. )
  491. X
  492. (defvar math-daylight-savings-hook 'math-std-daylight-savings)
  493. X
  494. (defun math-std-daylight-savings (date dt zone bump)
  495. X  "Standard North American daylight savings algorithm.
  496. This implements the rules for the U.S. and Canada as of 1987.
  497. Daylight savings begins on the first Sunday of April at 2 a.m.,
  498. and ends on the last Sunday of October at 2 a.m."
  499. X  (cond ((< (nth 1 dt) 4) 0)
  500. X    ((= (nth 1 dt) 4)
  501. X     (let ((sunday (math-prev-weekday-in-month date dt 7 0)))
  502. X       (cond ((< (nth 2 dt) sunday) 0)
  503. X         ((= (nth 2 dt) sunday)
  504. X          (if (>= (nth 3 dt) (+ 3 bump)) -1 0))
  505. X         (t -1))))
  506. X    ((< (nth 1 dt) 10) -1)
  507. X    ((= (nth 1 dt) 10)
  508. X     (let ((sunday (math-prev-weekday-in-month date dt 31 0)))
  509. X       (cond ((< (nth 2 dt) sunday) -1)
  510. X         ((= (nth 2 dt) sunday)
  511. X          (if (>= (nth 3 dt) (+ 2 bump)) 0 -1))
  512. X         (t 0))))
  513. X    (t 0))
  514. )
  515. X
  516. ;;; Compute the day (1-31) of the WDAY (0-6) on or preceding the given
  517. ;;; day of the given month.
  518. (defun math-prev-weekday-in-month (date dt day wday)
  519. X  (or day (setq day (nth 2 dt)))
  520. X  (if (> day (math-days-in-month (car dt) (nth 1 dt)))
  521. X      (setq day (math-days-in-month (car dt) (nth 1 dt))))
  522. X  (let ((zeroth (math-sub (math-floor date) (nth 2 dt))))
  523. X    (math-sub (nth 1 (calcFunc-newweek (math-add zeroth day))) zeroth))
  524. )
  525. X
  526. (defun calcFunc-pwday (date &optional day weekday)
  527. X  (if (eq (car-safe date) 'date)
  528. X      (setq date (nth 1 date)))
  529. X  (or (math-realp date)
  530. X      (math-reject-arg date 'datep))
  531. X  (if (math-messy-integerp day) (setq day (math-trunc day)))
  532. X  (or (integerp day) (math-reject-arg day 'fixnump))
  533. X  (if (= day 0) (setq day 31))
  534. X  (and (or (< day 7) (> day 31)) (math-reject-arg day 'range))
  535. X  (math-prev-weekday-in-month date (math-date-to-dt date) day (or weekday 0))
  536. )
  537. X
  538. X
  539. (defun calcFunc-newweek (date &optional weekday)
  540. X  (if (eq (car-safe date) 'date)
  541. X      (setq date (nth 1 date)))
  542. X  (or (math-realp date)
  543. X      (math-reject-arg date 'datep))
  544. X  (or weekday (setq weekday 0))
  545. X  (and (math-messy-integerp weekday) (setq weekday (math-trunc weekday)))
  546. X  (or (integerp weekday) (math-reject-arg weekday 'fixnump))
  547. X  (and (or (< weekday 0) (> weekday 6)) (math-reject-arg weekday 'range))
  548. X  (setq date (math-floor date))
  549. X  (list 'date (math-sub date (calcFunc-weekday (math-sub date weekday))))
  550. )
  551. X
  552. (defun calcFunc-newmonth (date &optional day)
  553. X  (or day (setq day 1))
  554. X  (and (math-messy-integerp day) (setq day (math-trunc day)))
  555. X  (or (integerp day) (math-reject-arg day 'fixnump))
  556. X  (and (or (< day 0) (> day 31)) (math-reject-arg day 'range))
  557. X  (let ((dt (math-date-to-dt date)))
  558. X    (if (or (= day 0) (> day (math-days-in-month (car dt) (nth 1 dt))))
  559. X    (setq day (math-days-in-month (car dt) (nth 1 dt))))
  560. X    (and (eq (car dt) 1752) (= (nth 1 dt) 9)
  561. X     (if (>= day 14) (setq day (- day 11))))
  562. X    (list 'date (math-add (math-dt-to-date (list (car dt) (nth 1 dt) 1))
  563. X              (1- day))))
  564. )
  565. X
  566. (defun calcFunc-newyear (date &optional day)
  567. X  (or day (setq day 1))
  568. X  (and (math-messy-integerp day) (setq day (math-trunc day)))
  569. X  (or (integerp day) (math-reject-arg day 'fixnump))
  570. X  (let ((dt (math-date-to-dt date)))
  571. X    (if (and (>= day 0) (<= day 366))
  572. X    (let ((max (if (eq (car dt) 1752) 355
  573. X             (if (math-leap-year-p (car dt)) 366 365))))
  574. X      (if (or (= day 0) (> day max)) (setq day max))
  575. X      (list 'date (math-add (math-dt-to-date (list (car dt) 1 1))
  576. X                (1- day))))
  577. X      (if (and (>= day -12) (<= day -1))
  578. X      (list 'date (math-dt-to-date (list (car dt) (- day) 1)))
  579. X    (math-reject-arg day 'range))))
  580. )
  581. X
  582. (defun calcFunc-incmonth (date &optional step)
  583. X  (or step (setq step 1))
  584. X  (and (math-messy-integerp step) (setq step (math-trunc step)))
  585. X  (or (math-integerp step) (math-reject-arg step 'integerp))
  586. X  (let* ((dt (math-date-to-dt date))
  587. X     (year (car dt))
  588. X     (month (math-add (1- (nth 1 dt)) step))
  589. X     (extra (calcFunc-idiv month 12))
  590. X     (day (nth 2 dt)))
  591. X    (setq month (1+ (math-sub month (math-mul extra 12)))
  592. X      year (math-add year extra)
  593. X      day (min day (math-days-in-month year month)))
  594. X    (and (math-posp (car dt)) (not (math-posp year))
  595. X     (setq year (math-sub year 1)))   ; did we go past the year zero?
  596. X    (and (math-negp (car dt)) (not (math-negp year))
  597. X     (setq year (math-add year 1)))
  598. X    (list 'date (math-dt-to-date
  599. X         (cons year (cons month (cons day (cdr (cdr (cdr dt)))))))))
  600. )
  601. X
  602. (defun calcFunc-incyear (date &optional step)
  603. X  (calcFunc-incmonth date (math-mul (or step 1) 12))
  604. )
  605. X
  606. X
  607. X
  608. X
  609. ;;;; Error forms.
  610. X
  611. ;;; Build a standard deviation form.  [X X X]
  612. (defun math-make-sdev (x sigma)
  613. X  (if (memq (car-safe x) '(date mod sdev intv vec))
  614. X      (math-reject-arg x 'realp))
  615. X  (if (memq (car-safe sigma) '(date mod sdev intv vec))
  616. X      (math-reject-arg sigma 'realp))
  617. X  (if (or (Math-negp sigma) (memq (car-safe sigma) '(cplx polar)))
  618. X      (setq sigma (math-abs sigma)))
  619. X  (if (and (Math-zerop sigma) (Math-scalarp x))
  620. X      x
  621. X    (list 'sdev x sigma))
  622. )
  623. (defun calcFunc-sdev (x sigma)
  624. X  (math-make-sdev x sigma)
  625. )
  626. X
  627. X
  628. X
  629. ;;;; Modulo forms.
  630. X
  631. (defun math-normalize-mod (a)
  632. X  (let ((n (math-normalize (nth 1 a)))
  633. X    (m (math-normalize (nth 2 a))))
  634. X    (if (and (math-anglep n) (math-anglep m) (math-posp m))
  635. X    (math-make-mod n m)
  636. X      (math-normalize (list 'calcFunc-makemod n m))))
  637. )
  638. X
  639. ;;; Build a modulo form.  [N R R]
  640. (defun math-make-mod (n m)
  641. X  (setq calc-previous-modulo m)
  642. X  (and n
  643. X       (cond ((not (Math-anglep m))
  644. X          (math-reject-arg m 'anglep))
  645. X         ((not (math-posp m))
  646. X          (math-reject-arg m 'posp))
  647. X         ((Math-anglep n)
  648. X          (if (or (Math-negp n)
  649. X              (not (Math-lessp n m)))
  650. X          (list 'mod (math-mod n m) m)
  651. X        (list 'mod n m)))
  652. X         ((memq (car n) '(+ - / vec neg))
  653. X          (math-normalize
  654. X           (cons (car n)
  655. X             (mapcar (function (lambda (x) (math-make-mod x m)))
  656. X                 (cdr n)))))
  657. X         ((and (eq (car n) '*) (Math-anglep (nth 1 n)))
  658. X          (math-mul (math-make-mod (nth 1 n) m) (nth 2 n)))
  659. X         ((memq (car n) '(* ^ var calcFunc-subscr))
  660. X          (math-mul (math-make-mod 1 m) n))
  661. X         (t (math-reject-arg n 'anglep))))
  662. )
  663. (defun calcFunc-makemod (n m)
  664. X  (math-make-mod n m)
  665. )
  666. X
  667. X
  668. X
  669. ;;;; Interval forms.
  670. X
  671. ;;; Build an interval form.  [X S X X]
  672. (defun math-make-intv (mask lo hi)
  673. X  (if (memq (car-safe lo) '(cplx polar mod sdev intv vec))
  674. X      (math-reject-arg lo 'realp))
  675. X  (if (memq (car-safe hi) '(cplx polar mod sdev intv vec))
  676. X      (math-reject-arg hi 'realp))
  677. X  (or (eq (eq (car-safe lo) 'date) (eq (car-safe hi) 'date))
  678. X      (math-reject-arg (if (eq (car-safe lo) 'date) hi lo) 'datep))
  679. X  (if (and (or (Math-realp lo) (eq (car lo) 'date))
  680. X       (or (Math-realp hi) (eq (car hi) 'date)))
  681. X      (let ((cmp (math-compare lo hi)))
  682. X    (if (= cmp 0)
  683. X        (if (= mask 3)
  684. X        lo
  685. X          (list 'intv mask lo hi))
  686. X      (if (> cmp 0)
  687. X          (if (= mask 3)
  688. X          (list 'intv 2 lo lo)
  689. X        (list 'intv mask lo lo))
  690. X        (list 'intv mask lo hi))))
  691. X    (list 'intv mask lo hi))
  692. )
  693. (defun calcFunc-intv (mask lo hi)
  694. X  (if (math-messy-integerp mask) (setq mask (math-trunc mask)))
  695. X  (or (natnump mask) (math-reject-arg mask 'fixnatnump))
  696. X  (or (<= mask 3) (math-reject-arg mask 'range))
  697. X  (math-make-intv mask lo hi)
  698. )
  699. X
  700. (defun math-sort-intv (mask lo hi)
  701. X  (if (Math-lessp hi lo)
  702. X      (math-make-intv (aref [0 2 1 3] mask) hi lo)
  703. X    (math-make-intv mask lo hi))
  704. )
  705. X
  706. X
  707. X
  708. X
  709. (defun math-combine-intervals (a am b bm c cm d dm)
  710. X  (let (res)
  711. X    (if (= (setq res (math-compare a c)) 1)
  712. X    (setq a c am cm)
  713. X      (if (= res 0)
  714. X      (setq am (or am cm))))
  715. X    (if (= (setq res (math-compare b d)) -1)
  716. X    (setq b d bm dm)
  717. X      (if (= res 0)
  718. X      (setq bm (or bm dm))))
  719. X    (math-make-intv (+ (if am 2 0) (if bm 1 0)) a b))
  720. )
  721. X
  722. X
  723. (defun math-div-mod (a b m)   ; [R R R R]  (Returns nil if no solution)
  724. X  (and (Math-integerp a) (Math-integerp b) (Math-integerp m)
  725. X       (let ((u1 1) (u3 b) (v1 0) (v3 m))
  726. X     (while (not (eq v3 0))   ; See Knuth sec 4.5.2, exercise 15
  727. X       (let* ((q (math-idivmod u3 v3))
  728. X          (t1 (math-sub u1 (math-mul v1 (car q)))))
  729. X         (setq u1 v1  u3 v3  v1 t1  v3 (cdr q))))
  730. X     (let ((q (math-idivmod a u3)))
  731. X       (and (eq (cdr q) 0)
  732. X        (math-mod (math-mul (car q) u1) m)))))
  733. )
  734. X
  735. (defun math-mod-intv (a b)
  736. X  (let* ((q1 (math-floor (math-div (nth 2 a) b)))
  737. X     (q2 (math-floor (math-div (nth 3 a) b)))
  738. X     (m1 (math-sub (nth 2 a) (math-mul q1 b)))
  739. X     (m2 (math-sub (nth 3 a) (math-mul q2 b))))
  740. X    (cond ((equal q1 q2)
  741. X       (math-sort-intv (nth 1 a) m1 m2))
  742. X      ((and (math-equal-int (math-sub q2 q1) 1)
  743. X        (math-zerop m2)
  744. X        (memq (nth 1 a) '(0 2)))
  745. X       (math-make-intv (nth 1 a) m1 b))
  746. X      (t
  747. X       (math-make-intv 2 0 b))))
  748. )
  749. X
  750. X
  751. (defun math-read-angle-brackets ()
  752. X  (let* ((last (or (math-check-for-commas t) (length exp-str)))
  753. X     (str (substring exp-str exp-pos last))
  754. X     (res
  755. X      (if (string-match "\\` *\\([a-zA-Z#][a-zA-Z0-9#]* *,? *\\)*:" str)
  756. X          (let ((str1 (substring str 0 (1- (match-end 0))))
  757. X            (str2 (substring str (match-end 0)))
  758. X            (calc-hashes-used 0))
  759. X        (setq str1 (math-read-expr (concat "[" str1 "]")))
  760. X        (if (eq (car-safe str1) 'error)
  761. X            str1
  762. X          (setq str2 (math-read-expr str2))
  763. X          (if (eq (car-safe str2) 'error)
  764. X              str2
  765. X            (append '(calcFunc-lambda) (cdr str1) (list str2)))))
  766. X        (if (string-match "#" str)
  767. X        (let ((calc-hashes-used 0))
  768. X          (and (setq str (math-read-expr str))
  769. X               (if (eq (car-safe str) 'error)
  770. X               str
  771. X             (append '(calcFunc-lambda)
  772. X                 (calc-invent-args calc-hashes-used)
  773. X                 (list str)))))
  774. X          (math-parse-date str)))))
  775. X    (if (stringp res)
  776. X    (throw 'syntax res))
  777. X    (if (eq (car-safe res) 'error)
  778. X    (throw 'syntax (nth 2 res)))
  779. X    (setq exp-pos (1+ last))
  780. X    (math-read-token)
  781. X    res)
  782. )
  783. X
  784. SHAR_EOF
  785. echo 'File calc-forms.el is complete' &&
  786. chmod 0644 calc-forms.el ||
  787. echo 'restore of calc-forms.el failed'
  788. Wc_c="`wc -c < 'calc-forms.el'`"
  789. test 51626 -eq "$Wc_c" ||
  790.     echo 'calc-forms.el: original size 51626, current size' "$Wc_c"
  791. rm -f _shar_wnt_.tmp
  792. fi
  793. # ============= calc-frac.el ==============
  794. if test -f 'calc-frac.el' -a X"$1" != X"-c"; then
  795.     echo 'x - skipping calc-frac.el (File already exists)'
  796.     rm -f _shar_wnt_.tmp
  797. else
  798. > _shar_wnt_.tmp
  799. echo 'x - extracting calc-frac.el (Text)'
  800. sed 's/^X//' << 'SHAR_EOF' > 'calc-frac.el' &&
  801. ;; Calculator for GNU Emacs, part II [calc-frac.el]
  802. ;; Copyright (C) 1990, 1991 Free Software Foundation, Inc.
  803. ;; Written by Dave Gillespie, daveg@csvax.cs.caltech.edu.
  804. X
  805. ;; This file is part of GNU Emacs.
  806. X
  807. ;; GNU Emacs is distributed in the hope that it will be useful,
  808. ;; but WITHOUT ANY WARRANTY.  No author or distributor
  809. ;; accepts responsibility to anyone for the consequences of using it
  810. ;; or for whether it serves any particular purpose or works at all,
  811. ;; unless he says so in writing.  Refer to the GNU Emacs General Public
  812. ;; License for full details.
  813. X
  814. ;; Everyone is granted permission to copy, modify and redistribute
  815. ;; GNU Emacs, but only under the conditions described in the
  816. ;; GNU Emacs General Public License.   A copy of this license is
  817. ;; supposed to have been given to you along with GNU Emacs so you
  818. ;; can know your rights and responsibilities.  It should be in a
  819. ;; file named COPYING.  Among other things, the copyright notice
  820. ;; and this notice must be preserved on all copies.
  821. X
  822. X
  823. X
  824. ;; This file is autoloaded from calc-ext.el.
  825. (require 'calc-ext)
  826. X
  827. (require 'calc-macs)
  828. X
  829. (defun calc-Need-calc-frac () nil)
  830. X
  831. X
  832. (defun calc-fdiv (arg)
  833. X  (interactive "P")
  834. X  (calc-slow-wrapper
  835. X   (calc-binary-op ":" 'calcFunc-fdiv arg 1))
  836. )
  837. X
  838. X
  839. (defun calc-fraction (arg)
  840. X  (interactive "P")
  841. X  (calc-slow-wrapper
  842. X   (let ((func (if (calc-is-hyperbolic) 'calcFunc-frac 'calcFunc-pfrac)))
  843. X     (if (eq arg 0)
  844. X     (calc-enter-result 2 "frac" (list func
  845. X                       (calc-top-n 2)
  846. X                       (calc-top-n 1)))
  847. X       (calc-enter-result 1 "frac" (list func
  848. X                     (calc-top-n 1)
  849. X                     (prefix-numeric-value (or arg 0)))))))
  850. )
  851. X
  852. X
  853. (defun calc-over-notation (fmt)
  854. X  (interactive "sFraction separator (:, ::, /, //, :/): ")
  855. X  (calc-wrapper
  856. X   (if (string-match "\\`\\([^ 0-9][^ 0-9]?\\)[0-9]*\\'" fmt)
  857. X       (let ((n nil))
  858. X     (if (/= (match-end 0) (match-end 1))
  859. X         (setq n (string-to-int (substring fmt (match-end 1)))
  860. X           fmt (math-match-substring fmt 1)))
  861. X     (if (eq n 0) (error "Bad denominator"))
  862. X     (calc-change-mode 'calc-frac-format (list fmt n) t))
  863. X     (error "Bad fraction separator format.")))
  864. )
  865. X
  866. (defun calc-slash-notation (n)
  867. X  (interactive "P")
  868. X  (calc-wrapper
  869. X   (calc-change-mode 'calc-frac-format (if n '("//" nil) '("/" nil)) t))
  870. )
  871. X
  872. X
  873. (defun calc-frac-mode (n)
  874. X  (interactive "P")
  875. X  (calc-wrapper
  876. X   (calc-change-mode 'calc-prefer-frac n nil t)
  877. X   (message (if calc-prefer-frac
  878. X        "Integer division will now generate fractions."
  879. X          "Integer division will now generate floating-point results.")))
  880. )
  881. X
  882. X
  883. X
  884. X
  885. X
  886. ;;;; Fractions.
  887. X
  888. ;;; Build a normalized fraction.  [R I I]
  889. ;;; (This could probably be implemented more efficiently than using
  890. ;;;  the plain gcd algorithm.)
  891. (defun math-make-frac (num den)
  892. X  (if (Math-integer-negp den)
  893. X      (setq num (math-neg num)
  894. X        den (math-neg den)))
  895. X  (let ((gcd (math-gcd num den)))
  896. X    (if (eq gcd 1)
  897. X    (if (eq den 1)
  898. X        num
  899. X      (list 'frac num den))
  900. X      (if (equal gcd den)
  901. X      (math-quotient num gcd)
  902. X    (list 'frac (math-quotient num gcd) (math-quotient den gcd)))))
  903. )
  904. X
  905. (defun calc-add-fractions (a b)
  906. X  (if (eq (car-safe a) 'frac)
  907. X      (if (eq (car-safe b) 'frac)
  908. X      (math-make-frac (math-add (math-mul (nth 1 a) (nth 2 b))
  909. X                    (math-mul (nth 2 a) (nth 1 b)))
  910. X              (math-mul (nth 2 a) (nth 2 b)))
  911. X    (math-make-frac (math-add (nth 1 a)
  912. X                  (math-mul (nth 2 a) b))
  913. X            (nth 2 a)))
  914. X    (math-make-frac (math-add (math-mul a (nth 2 b))
  915. X                  (nth 1 b))
  916. X            (nth 2 b)))
  917. )
  918. X
  919. (defun calc-mul-fractions (a b)
  920. X  (if (eq (car-safe a) 'frac)
  921. X      (if (eq (car-safe b) 'frac)
  922. X      (math-make-frac (math-mul (nth 1 a) (nth 1 b))
  923. X              (math-mul (nth 2 a) (nth 2 b)))
  924. X    (math-make-frac (math-mul (nth 1 a) b)
  925. X            (nth 2 a)))
  926. X    (math-make-frac (math-mul a (nth 1 b))
  927. X            (nth 2 b)))
  928. )
  929. X
  930. (defun calc-div-fractions (a b)
  931. X  (if (eq (car-safe a) 'frac)
  932. X      (if (eq (car-safe b) 'frac)
  933. X      (math-make-frac (math-mul (nth 1 a) (nth 2 b))
  934. X              (math-mul (nth 2 a) (nth 1 b)))
  935. X    (math-make-frac (nth 1 a)
  936. X            (math-mul (nth 2 a) b)))
  937. X    (math-make-frac (math-mul a (nth 2 b))
  938. X            (nth 1 b)))
  939. )
  940. X
  941. X
  942. X
  943. X
  944. ;;; Convert a real value to fractional form.  [T R I; T R F] [Public]
  945. (defun calcFunc-frac (a &optional tol)
  946. X  (or tol (setq tol 0))
  947. X  (cond ((Math-ratp a)
  948. X     a)
  949. X    ((memq (car a) '(cplx polar vec hms date sdev intv mod))
  950. X     (cons (car a) (mapcar (function
  951. X                (lambda (x)
  952. X                  (calcFunc-frac x tol)))
  953. X                   (cdr a))))
  954. X    ((Math-messy-integerp a)
  955. X     (math-trunc a))
  956. X    ((Math-negp a)
  957. X     (math-neg (calcFunc-frac (math-neg a) tol)))
  958. X    ((not (eq (car a) 'float))
  959. X     (if (math-infinitep a)
  960. X         a
  961. X       (if (math-provably-integerp a)
  962. X           a
  963. X         (math-reject-arg a 'numberp))))
  964. X    ((integerp tol)
  965. X     (if (<= tol 0)
  966. X         (setq tol (+ tol calc-internal-prec)))
  967. X     (calcFunc-frac a (list 'float 5
  968. X                (- (+ (math-numdigs (nth 1 a))
  969. X                      (nth 2 a))
  970. X                   (1+ tol)))))
  971. X    ((not (eq (car tol) 'float))
  972. X     (if (Math-realp tol)
  973. X         (calcFunc-frac a (math-float tol))
  974. X       (math-reject-arg tol 'realp)))
  975. X    ((Math-negp tol)
  976. X     (calcFunc-frac a (math-neg tol)))
  977. X    ((Math-zerop tol)
  978. X     (calcFunc-frac a 0))
  979. X    ((not (math-lessp-float tol '(float 1 0)))
  980. X     (math-trunc a))
  981. X    ((Math-zerop a)
  982. X     0)
  983. X    (t
  984. X     (let ((cfrac (math-continued-fraction a tol))
  985. X           (calc-prefer-frac t))
  986. X       (math-eval-continued-fraction cfrac))))
  987. )
  988. X
  989. (defun math-continued-fraction (a tol)
  990. X  (let ((calc-internal-prec (+ calc-internal-prec 2)))
  991. X    (let ((cfrac nil)
  992. X      (aa a)
  993. X      (calc-prefer-frac nil)
  994. X      int)
  995. X      (while (or (null cfrac)
  996. X         (and (not (Math-zerop aa))
  997. X              (not (math-lessp-float
  998. X                (math-abs
  999. X                 (math-sub a
  1000. X                       (let ((f (math-eval-continued-fraction
  1001. X                         cfrac)))
  1002. X                     (math-working "Fractionalize" f)
  1003. X                     f)))
  1004. X                tol))))
  1005. X    (setq int (math-trunc aa)
  1006. X          aa (math-sub aa int)
  1007. X          cfrac (cons int cfrac))
  1008. X    (or (Math-zerop aa)
  1009. X        (setq aa (math-div 1 aa))))
  1010. X      cfrac))
  1011. )
  1012. X
  1013. (defun math-eval-continued-fraction (cf)
  1014. X  (let ((n (car cf))
  1015. X    (d 1)
  1016. X    temp)
  1017. X    (while (setq cf (cdr cf))
  1018. X      (setq temp (math-add (math-mul (car cf) n) d)
  1019. X        d n
  1020. X        n temp))
  1021. X    (math-div n d))
  1022. )
  1023. X
  1024. X
  1025. X
  1026. (defun calcFunc-fdiv (a b)   ; [R I I] [Public]
  1027. X  (if (Math-num-integerp a)
  1028. X      (if (Math-num-integerp b)
  1029. X      (if (Math-zerop b)
  1030. X          (math-reject-arg a "*Division by zero")
  1031. X        (math-make-frac (math-trunc a) (math-trunc b)))
  1032. X    (math-reject-arg b 'integerp))
  1033. X    (math-reject-arg a 'integerp))
  1034. )
  1035. X
  1036. SHAR_EOF
  1037. chmod 0644 calc-frac.el ||
  1038. echo 'restore of calc-frac.el failed'
  1039. Wc_c="`wc -c < 'calc-frac.el'`"
  1040. test 6304 -eq "$Wc_c" ||
  1041.     echo 'calc-frac.el: original size 6304, current size' "$Wc_c"
  1042. rm -f _shar_wnt_.tmp
  1043. fi
  1044. # ============= calc-funcs.el ==============
  1045. if test -f 'calc-funcs.el' -a X"$1" != X"-c"; then
  1046.     echo 'x - skipping calc-funcs.el (File already exists)'
  1047.     rm -f _shar_wnt_.tmp
  1048. else
  1049. > _shar_wnt_.tmp
  1050. echo 'x - extracting calc-funcs.el (Text)'
  1051. sed 's/^X//' << 'SHAR_EOF' > 'calc-funcs.el' &&
  1052. ;; Calculator for GNU Emacs, part II [calc-funcs.el]
  1053. ;; Copyright (C) 1990, 1991 Free Software Foundation, Inc.
  1054. ;; Written by Dave Gillespie, daveg@csvax.cs.caltech.edu.
  1055. X
  1056. ;; This file is part of GNU Emacs.
  1057. X
  1058. ;; GNU Emacs is distributed in the hope that it will be useful,
  1059. ;; but WITHOUT ANY WARRANTY.  No author or distributor
  1060. ;; accepts responsibility to anyone for the consequences of using it
  1061. ;; or for whether it serves any particular purpose or works at all,
  1062. ;; unless he says so in writing.  Refer to the GNU Emacs General Public
  1063. ;; License for full details.
  1064. X
  1065. ;; Everyone is granted permission to copy, modify and redistribute
  1066. ;; GNU Emacs, but only under the conditions described in the
  1067. ;; GNU Emacs General Public License.   A copy of this license is
  1068. ;; supposed to have been given to you along with GNU Emacs so you
  1069. ;; can know your rights and responsibilities.  It should be in a
  1070. ;; file named COPYING.  Among other things, the copyright notice
  1071. ;; and this notice must be preserved on all copies.
  1072. X
  1073. X
  1074. X
  1075. ;; This file is autoloaded from calc-ext.el.
  1076. (require 'calc-ext)
  1077. X
  1078. (require 'calc-macs)
  1079. X
  1080. (defun calc-Need-calc-funcs () nil)
  1081. X
  1082. X
  1083. (defun calc-inc-gamma (arg)
  1084. X  (interactive "P")
  1085. X  (calc-slow-wrapper
  1086. X   (if (calc-is-inverse)
  1087. X       (if (calc-is-hyperbolic)
  1088. X       (calc-binary-op "gamG" 'calcFunc-gammaG arg)
  1089. X     (calc-binary-op "gamQ" 'calcFunc-gammaQ arg))
  1090. X       (if (calc-is-hyperbolic)
  1091. X       (calc-binary-op "gamg" 'calcFunc-gammag arg)
  1092. X     (calc-binary-op "gamP" 'calcFunc-gammaP arg))))
  1093. )
  1094. X
  1095. (defun calc-erf (arg)
  1096. X  (interactive "P")
  1097. X  (calc-slow-wrapper
  1098. X   (if (calc-is-inverse)
  1099. X       (calc-unary-op "erfc" 'calcFunc-erfc arg)
  1100. X     (calc-unary-op "erf" 'calcFunc-erf arg)))
  1101. )
  1102. X
  1103. (defun calc-erfc (arg)
  1104. X  (interactive "P")
  1105. X  (calc-invert-func)
  1106. X  (calc-erf arg)
  1107. )
  1108. X
  1109. (defun calc-beta (arg)
  1110. X  (interactive "P")
  1111. X  (calc-slow-wrapper
  1112. X   (calc-binary-op "beta" 'calcFunc-beta arg))
  1113. )
  1114. X
  1115. (defun calc-inc-beta ()
  1116. X  (interactive)
  1117. X  (calc-slow-wrapper
  1118. X   (if (calc-is-hyperbolic)
  1119. X       (calc-enter-result 3 "betB" (cons 'calcFunc-betaB (calc-top-list-n 3)))
  1120. X     (calc-enter-result 3 "betI" (cons 'calcFunc-betaI (calc-top-list-n 3)))))
  1121. )
  1122. X
  1123. (defun calc-bessel-J (arg)
  1124. X  (interactive "P")
  1125. X  (calc-slow-wrapper
  1126. X   (calc-binary-op "besJ" 'calcFunc-besJ arg))
  1127. )
  1128. X
  1129. (defun calc-bessel-Y (arg)
  1130. X  (interactive "P")
  1131. X  (calc-slow-wrapper
  1132. X   (calc-binary-op "besY" 'calcFunc-besY arg))
  1133. )
  1134. X
  1135. (defun calc-bernoulli-number (arg)
  1136. X  (interactive "P")
  1137. X  (calc-slow-wrapper
  1138. X   (if (calc-is-hyperbolic)
  1139. X       (calc-binary-op "bern" 'calcFunc-bern arg)
  1140. X     (calc-unary-op "bern" 'calcFunc-bern arg)))
  1141. )
  1142. X
  1143. (defun calc-euler-number (arg)
  1144. X  (interactive "P")
  1145. X  (calc-slow-wrapper
  1146. X   (if (calc-is-hyperbolic)
  1147. X       (calc-binary-op "eulr" 'calcFunc-euler arg)
  1148. X     (calc-unary-op "eulr" 'calcFunc-euler arg)))
  1149. )
  1150. X
  1151. (defun calc-stirling-number (arg)
  1152. X  (interactive "P")
  1153. X  (calc-slow-wrapper
  1154. X   (if (calc-is-hyperbolic)
  1155. X       (calc-binary-op "str2" 'calcFunc-stir2 arg)
  1156. X     (calc-binary-op "str1" 'calcFunc-stir1 arg)))
  1157. )
  1158. X
  1159. (defun calc-utpb ()
  1160. X  (interactive)
  1161. X  (calc-prob-dist "b" 3)
  1162. )
  1163. X
  1164. (defun calc-utpc ()
  1165. X  (interactive)
  1166. X  (calc-prob-dist "c" 2)
  1167. )
  1168. X
  1169. (defun calc-utpf ()
  1170. X  (interactive)
  1171. X  (calc-prob-dist "f" 3)
  1172. )
  1173. X
  1174. (defun calc-utpn ()
  1175. X  (interactive)
  1176. X  (calc-prob-dist "n" 3)
  1177. )
  1178. X
  1179. (defun calc-utpp ()
  1180. X  (interactive)
  1181. X  (calc-prob-dist "p" 2)
  1182. )
  1183. X
  1184. (defun calc-utpt ()
  1185. X  (interactive)
  1186. X  (calc-prob-dist "t" 2)
  1187. )
  1188. X
  1189. (defun calc-prob-dist (letter nargs)
  1190. X  (calc-slow-wrapper
  1191. X   (if (calc-is-inverse)
  1192. X       (calc-enter-result nargs (concat "ltp" letter)
  1193. X              (append (list (intern (concat "calcFunc-ltp" letter))
  1194. X                    (calc-top-n 1))
  1195. X                  (calc-top-list-n (1- nargs) 2)))
  1196. X     (calc-enter-result nargs (concat "utp" letter)
  1197. X            (append (list (intern (concat "calcFunc-utp" letter))
  1198. X                      (calc-top-n 1))
  1199. X                (calc-top-list-n (1- nargs) 2)))))
  1200. )
  1201. X
  1202. X
  1203. X
  1204. X
  1205. ;;; Sources:  Numerical Recipes, Press et al;
  1206. ;;;           Handbook of Mathematical Functions, Abramowitz & Stegun.
  1207. X
  1208. X
  1209. ;;; Gamma function.
  1210. X
  1211. (defun calcFunc-gamma (x)
  1212. X  (or (math-numberp x) (math-reject-arg x 'numberp))
  1213. X  (calcFunc-fact (math-add x -1))
  1214. )
  1215. X
  1216. (defun math-gammap1-raw (x &optional fprec nfprec)   ; compute gamma(1 + x)
  1217. X  (or fprec
  1218. X      (setq fprec (math-float calc-internal-prec)
  1219. X        nfprec (math-float (- calc-internal-prec))))
  1220. X  (cond ((math-lessp-float (calcFunc-re x) fprec)
  1221. X     (if (math-lessp-float (calcFunc-re x) nfprec)
  1222. X         (math-neg (math-div
  1223. X            (math-pi)
  1224. X            (math-mul (math-gammap1-raw
  1225. X                   (math-add (math-neg x)
  1226. X                         '(float -1 0))
  1227. X                   fprec nfprec)
  1228. X                  (math-sin-raw
  1229. X                   (math-mul (math-pi) x)))))
  1230. X       (let ((xplus1 (math-add x '(float 1 0))))
  1231. X         (math-div (math-gammap1-raw xplus1 fprec nfprec) xplus1))))
  1232. X    ((and (math-realp x)
  1233. X          (math-lessp-float '(float 736276 0) x))
  1234. X     (math-overflow))
  1235. X    (t   ; re(x) now >= 10.0
  1236. X     (let ((xinv (math-div 1 x))
  1237. X           (lnx (math-ln-raw x)))
  1238. X       (math-mul (math-sqrt-two-pi)
  1239. X             (math-exp-raw
  1240. X              (math-gamma-series
  1241. X               (math-sub (math-mul (math-add x '(float 5 -1))
  1242. X                       lnx)
  1243. X                 x)
  1244. X               xinv
  1245. X               (math-sqr xinv)
  1246. X               '(float 0 0)
  1247. X               2))))))
  1248. )
  1249. X
  1250. (defun math-gamma-series (sum x xinvsqr oterm n)
  1251. X  (math-working "gamma" sum)
  1252. X  (let* ((bn (math-bernoulli-number n))
  1253. X     (term (math-mul (math-div-float (math-float (nth 1 bn))
  1254. X                     (math-float (* (nth 2 bn)
  1255. X                            (* n (1- n)))))
  1256. X             x))
  1257. X     (next (math-add sum term)))
  1258. X    (if (math-nearly-equal sum next)
  1259. X    next
  1260. X      (if (> n (* 2 calc-internal-prec))
  1261. X      (progn
  1262. X        ;; Need this because series eventually diverges for large enough n.
  1263. X        (calc-record-why
  1264. X         "*Gamma computation stopped early, not all digits may be valid")
  1265. X        next)
  1266. X    (math-gamma-series next (math-mul x xinvsqr) xinvsqr term (+ n 2)))))
  1267. )
  1268. X
  1269. X
  1270. ;;; Incomplete gamma function.
  1271. X
  1272. (defun calcFunc-gammaP (a x)
  1273. X  (if (equal x '(var inf var-inf))
  1274. X      '(float 1 0)
  1275. X    (math-inexact-result)
  1276. X    (or (Math-numberp a) (math-reject-arg a 'numberp))
  1277. X    (or (math-numberp x) (math-reject-arg x 'numberp))
  1278. X    (if (and (math-num-integerp a)
  1279. X         (integerp (setq a (math-trunc a)))
  1280. X         (> a 0) (< a 20))
  1281. X    (math-sub 1 (calcFunc-gammaQ a x))
  1282. X      (let ((math-current-gamma-value (calcFunc-gamma a)))
  1283. X    (math-div (calcFunc-gammag a x) math-current-gamma-value))))
  1284. )
  1285. X
  1286. (defun calcFunc-gammaQ (a x)
  1287. X  (if (equal x '(var inf var-inf))
  1288. X      '(float 0 0)
  1289. X    (math-inexact-result)
  1290. X    (or (Math-numberp a) (math-reject-arg a 'numberp))
  1291. X    (or (math-numberp x) (math-reject-arg x 'numberp))
  1292. X    (if (and (math-num-integerp a)
  1293. X         (integerp (setq a (math-trunc a)))
  1294. X         (> a 0) (< a 20))
  1295. X    (let ((n 0)
  1296. X          (sum '(float 1 0))
  1297. X          (term '(float 1 0)))
  1298. X      (math-with-extra-prec 1
  1299. X        (while (< (setq n (1+ n)) a)
  1300. X          (setq term (math-div (math-mul term x) n)
  1301. X            sum (math-add sum term))
  1302. X          (math-working "gamma" sum))
  1303. X        (math-mul sum (calcFunc-exp (math-neg x)))))
  1304. X      (let ((math-current-gamma-value (calcFunc-gamma a)))
  1305. X    (math-div (calcFunc-gammaG a x) math-current-gamma-value))))
  1306. )
  1307. X
  1308. (defun calcFunc-gammag (a x)
  1309. X  (if (equal x '(var inf var-inf))
  1310. X      (calcFunc-gamma a)
  1311. X    (math-inexact-result)
  1312. X    (or (Math-numberp a) (math-reject-arg a 'numberp))
  1313. X    (or (Math-numberp x) (math-reject-arg x 'numberp))
  1314. X    (math-with-extra-prec 2
  1315. X      (setq a (math-float a))
  1316. X      (setq x (math-float x))
  1317. X      (if (or (math-negp (calcFunc-re a))
  1318. X          (math-lessp-float (calcFunc-re x)
  1319. X                (math-add-float (calcFunc-re a)
  1320. X                        '(float 1 0))))
  1321. X      (math-inc-gamma-series a x)
  1322. X    (math-sub (or math-current-gamma-value (calcFunc-gamma a))
  1323. X          (math-inc-gamma-cfrac a x)))))
  1324. )
  1325. (setq math-current-gamma-value nil)
  1326. X
  1327. (defun calcFunc-gammaG (a x)
  1328. X  (if (equal x '(var inf var-inf))
  1329. X      '(float 0 0)
  1330. X    (math-inexact-result)
  1331. X    (or (Math-numberp a) (math-reject-arg a 'numberp))
  1332. X    (or (Math-numberp x) (math-reject-arg x 'numberp))
  1333. X    (math-with-extra-prec 2
  1334. X      (setq a (math-float a))
  1335. X      (setq x (math-float x))
  1336. X      (if (or (math-negp (calcFunc-re a))
  1337. X          (math-lessp-float (calcFunc-re x)
  1338. X                (math-add-float (math-abs-approx a)
  1339. X                        '(float 1 0))))
  1340. X      (math-sub (or math-current-gamma-value (calcFunc-gamma a))
  1341. X            (math-inc-gamma-series a x))
  1342. X    (math-inc-gamma-cfrac a x))))
  1343. )
  1344. X
  1345. (defun math-inc-gamma-series (a x)
  1346. X  (if (Math-zerop x)
  1347. X      '(float 0 0)
  1348. X    (math-mul (math-exp-raw (math-sub (math-mul a (math-ln-raw x)) x))
  1349. X          (math-with-extra-prec 2
  1350. X        (let ((start (math-div '(float 1 0) a)))
  1351. X          (math-inc-gamma-series-step start start a x)))))
  1352. )
  1353. X
  1354. (defun math-inc-gamma-series-step (sum term a x)
  1355. X  (math-working "gamma" sum)
  1356. X  (setq a (math-add a '(float 1 0))
  1357. X    term (math-div (math-mul term x) a))
  1358. X  (let ((next (math-add sum term)))
  1359. X    (if (math-nearly-equal sum next)
  1360. X    next
  1361. X      (math-inc-gamma-series-step next term a x)))
  1362. )
  1363. X
  1364. (defun math-inc-gamma-cfrac (a x)
  1365. X  (if (Math-zerop x)
  1366. X      (or math-current-gamma-value (calcFunc-gamma a))
  1367. X    (math-mul (math-exp-raw (math-sub (math-mul a (math-ln-raw x)) x))
  1368. X          (math-inc-gamma-cfrac-step '(float 1 0) x
  1369. X                     '(float 0 0) '(float 1 0)
  1370. X                     '(float 1 0) '(float 1 0) '(float 0 0)
  1371. X                     a x)))
  1372. )
  1373. X
  1374. (defun math-inc-gamma-cfrac-step (a0 a1 b0 b1 n fac g a x)
  1375. X  (let ((ana (math-sub n a))
  1376. X    (anf (math-mul n fac)))
  1377. X    (setq n (math-add n '(float 1 0))
  1378. X      a0 (math-mul (math-add a1 (math-mul a0 ana)) fac)
  1379. X      b0 (math-mul (math-add b1 (math-mul b0 ana)) fac)
  1380. X      a1 (math-add (math-mul x a0) (math-mul anf a1))
  1381. X      b1 (math-add (math-mul x b0) (math-mul anf b1)))
  1382. X    (if (math-zerop a1)
  1383. X    (math-inc-gamma-cfrac-step a0 a1 b0 b1 n fac g a x)
  1384. X      (setq fac (math-div '(float 1 0) a1))
  1385. X      (let ((next (math-mul b1 fac)))
  1386. X    (math-working "gamma" next)
  1387. X    (if (math-nearly-equal next g)
  1388. X        next
  1389. X      (math-inc-gamma-cfrac-step a0 a1 b0 b1 n fac next a x)))))
  1390. )
  1391. X
  1392. X
  1393. ;;; Error function.
  1394. X
  1395. (defun calcFunc-erf (x)
  1396. X  (if (equal x '(var inf var-inf))
  1397. X      '(float 1 0)
  1398. X    (if (equal x '(neg (var inf var-inf)))
  1399. X    '(float -1 0)
  1400. X      (let ((math-current-gamma-value (math-sqrt-pi)))
  1401. X    (math-to-same-complex-quad
  1402. X     (math-div (calcFunc-gammag '(float 5 -1)
  1403. X                    (math-sqr (math-to-complex-quad-one x)))
  1404. X           math-current-gamma-value)
  1405. X     x))))
  1406. )
  1407. X
  1408. (defun calcFunc-erfc (x)
  1409. X  (if (equal x '(var inf var-inf))
  1410. X      '(float 0 0)
  1411. X    (if (math-posp x)
  1412. X    (let ((math-current-gamma-value (math-sqrt-pi)))
  1413. X      (math-div (calcFunc-gammaG '(float 5 -1) (math-sqr x))
  1414. X            math-current-gamma-value))
  1415. X      (math-add '(float 1 0) (calcFunc-erf (math-neg x)))))
  1416. )
  1417. X
  1418. (defun math-to-complex-quad-one (x)
  1419. X  (if (eq (car-safe x) 'polar) (setq x (math-complex x)))
  1420. X  (if (eq (car-safe x) 'cplx)
  1421. X      (list 'cplx (math-abs (nth 1 x)) (math-abs (nth 2 x)))
  1422. X    x)
  1423. )
  1424. X
  1425. (defun math-to-same-complex-quad (x y)
  1426. X  (if (eq (car-safe y) 'cplx)
  1427. X      (if (eq (car-safe x) 'cplx)
  1428. X      (list 'cplx
  1429. X        (if (math-negp (nth 1 y)) (math-neg (nth 1 x)) (nth 1 x))
  1430. X        (if (math-negp (nth 2 y)) (math-neg (nth 2 x)) (nth 2 x)))
  1431. X    (if (math-negp (nth 1 y)) (math-neg x) x))
  1432. X    (if (math-negp y)
  1433. X    (if (eq (car-safe x) 'cplx)
  1434. X        (list 'cplx (math-neg (nth 1 x)) (nth 2 x))
  1435. X      (math-neg x))
  1436. X      x))
  1437. )
  1438. X
  1439. X
  1440. ;;; Beta function.
  1441. X
  1442. (defun calcFunc-beta (a b)
  1443. X  (if (math-num-integerp a)
  1444. X      (let ((am (math-add a -1)))
  1445. X    (or (math-numberp b) (math-reject-arg b 'numberp))
  1446. X    (math-div 1 (math-mul b (calcFunc-choose (math-add b am) am))))
  1447. X    (if (math-num-integerp b)
  1448. X    (calcFunc-beta b a)
  1449. X      (math-div (math-mul (calcFunc-gamma a) (calcFunc-gamma b))
  1450. X        (calcFunc-gamma (math-add a b)))))
  1451. )
  1452. X
  1453. X
  1454. ;;; Incomplete beta function.
  1455. X
  1456. (defun calcFunc-betaI (x a b)
  1457. X  (cond ((math-zerop x)
  1458. X     '(float 0 0))
  1459. X    ((math-equal-int x 1)
  1460. X     '(float 1 0))
  1461. X    ((or (math-zerop a)
  1462. X         (and (math-num-integerp a)
  1463. X          (math-negp a)))
  1464. X     (if (or (math-zerop b)
  1465. X         (and (math-num-integerp b)
  1466. X              (math-negp b)))
  1467. X         (math-reject-arg b 'range)
  1468. X       '(float 1 0)))
  1469. X    ((or (math-zerop b)
  1470. X         (and (math-num-integerp b)
  1471. X          (math-negp b)))
  1472. X     '(float 0 0))
  1473. X    ((not (math-numberp a)) (math-reject-arg a 'numberp))
  1474. X    ((not (math-numberp b)) (math-reject-arg b 'numberp))
  1475. X    ((math-inexact-result))
  1476. X    (t (let ((math-current-beta-value (calcFunc-beta a b)))
  1477. X         (math-div (calcFunc-betaB x a b) math-current-beta-value))))
  1478. )
  1479. X
  1480. (defun calcFunc-betaB (x a b)
  1481. X  (cond
  1482. X   ((math-zerop x)
  1483. X    '(float 0 0))
  1484. X   ((math-equal-int x 1)
  1485. X    (calcFunc-beta a b))
  1486. X   ((not (math-numberp x)) (math-reject-arg x 'numberp))
  1487. X   ((not (math-numberp a)) (math-reject-arg a 'numberp))
  1488. X   ((not (math-numberp b)) (math-reject-arg b 'numberp))
  1489. X   ((math-zerop a) (math-reject-arg a 'nonzerop))
  1490. X   ((math-zerop b) (math-reject-arg b 'nonzerop))
  1491. X   ((and (math-num-integerp b)
  1492. X     (if (math-negp b)
  1493. X         (math-reject-arg b 'range)
  1494. X       (Math-natnum-lessp (setq b (math-trunc b)) 20)))
  1495. X    (and calc-symbolic-mode (or (math-floatp a) (math-floatp b))
  1496. X     (math-inexact-result))
  1497. X    (math-mul
  1498. X     (math-with-extra-prec 2
  1499. X       (let* ((i 0)
  1500. X          (term 1)
  1501. X          (sum (math-div term a)))
  1502. X     (while (< (setq i (1+ i)) b)
  1503. X       (setq term (math-mul (math-div (math-mul term (- i b)) i) x)
  1504. X         sum (math-add sum (math-div term (math-add a i))))
  1505. X       (math-working "beta" sum))
  1506. X     sum))
  1507. X     (math-pow x a)))
  1508. X   ((and (math-num-integerp a)
  1509. X     (if (math-negp a)
  1510. X         (math-reject-arg a 'range)
  1511. X       (Math-natnum-lessp (setq a (math-trunc a)) 20)))
  1512. X    (math-sub (or math-current-beta-value (calcFunc-beta a b))
  1513. X          (calcFunc-betaB (math-sub 1 x) b a)))
  1514. X   (t
  1515. X    (math-inexact-result)
  1516. X    (math-with-extra-prec 2
  1517. X      (setq x (math-float x))
  1518. X      (setq a (math-float a))
  1519. X      (setq b (math-float b))
  1520. X      (let ((bt (math-exp-raw (math-add (math-mul a (math-ln-raw x))
  1521. X                    (math-mul b (math-ln-raw
  1522. X                             (math-sub '(float 1 0)
  1523. X                                   x)))))))
  1524. X    (if (Math-lessp x (math-div (math-add a '(float 1 0))
  1525. X                    (math-add (math-add a b) '(float 2 0))))
  1526. X        (math-div (math-mul bt (math-beta-cfrac a b x)) a)
  1527. X      (math-sub (or math-current-beta-value (calcFunc-beta a b))
  1528. X            (math-div (math-mul bt
  1529. X                    (math-beta-cfrac b a (math-sub 1 x)))
  1530. X                  b)))))))
  1531. )
  1532. (setq math-current-beta-value nil)
  1533. X
  1534. (defun math-beta-cfrac (a b x)
  1535. X  (let ((qab (math-add a b))
  1536. X    (qap (math-add a '(float 1 0)))
  1537. X    (qam (math-add a '(float -1 0))))
  1538. X    (math-beta-cfrac-step '(float 1 0)
  1539. X              (math-sub '(float 1 0)
  1540. X                    (math-div (math-mul qab x) qap))
  1541. X              '(float 1 0) '(float 1 0)
  1542. X              '(float 1 0)
  1543. X              qab qap qam a b x))
  1544. )
  1545. X
  1546. (defun math-beta-cfrac-step (az bz am bm m qab qap qam a b x)
  1547. X  (let* ((two-m (math-mul m '(float 2 0)))
  1548. X     (d (math-div (math-mul (math-mul (math-sub b m) m) x)
  1549. X              (math-mul (math-add qam two-m) (math-add a two-m))))
  1550. X     (ap (math-add az (math-mul d am)))
  1551. X     (bp (math-add bz (math-mul d bm)))
  1552. X     (d2 (math-neg
  1553. X          (math-div (math-mul (math-mul (math-add a m) (math-add qab m)) x)
  1554. X            (math-mul (math-add qap two-m) (math-add a two-m)))))
  1555. X     (app (math-add ap (math-mul d2 az)))
  1556. X     (bpp (math-add bp (math-mul d2 bz)))
  1557. X     (next (math-div app bpp)))
  1558. X    (math-working "beta" next)
  1559. X    (if (math-nearly-equal next az)
  1560. X    next
  1561. X      (math-beta-cfrac-step next '(float 1 0)
  1562. X                (math-div ap bpp) (math-div bp bpp)
  1563. X                (math-add m '(float 1 0))
  1564. X                qab qap qam a b x)))
  1565. )
  1566. X
  1567. X
  1568. ;;; Bessel functions.
  1569. X
  1570. ;;; Should generalize this to handle arbitrary precision!
  1571. X
  1572. (defun calcFunc-besJ (v x)
  1573. X  (or (math-numberp v) (math-reject-arg v 'numberp))
  1574. X  (or (math-numberp x) (math-reject-arg x 'numberp))
  1575. X  (let ((calc-internal-prec (min 8 calc-internal-prec)))
  1576. X    (math-with-extra-prec 3
  1577. X      (setq x (math-float (math-normalize x)))
  1578. X      (setq v (math-float (math-normalize v)))
  1579. X      (cond ((math-zerop x)
  1580. X         (if (math-zerop v)
  1581. X         '(float 1 0)
  1582. X           '(float 0 0)))
  1583. X        ((math-inexact-result))
  1584. X        ((not (math-num-integerp v))
  1585. X         (let ((start (math-div 1 (calcFunc-fact v))))
  1586. X           (math-mul (math-besJ-series start start
  1587. X                       0
  1588. X                       (math-mul '(float -25 -2)
  1589. X                             (math-sqr x))
  1590. X                       v)
  1591. X             (math-pow (math-div x 2) v))))
  1592. X        ((math-negp (setq v (math-trunc v)))
  1593. X         (if (math-oddp v)
  1594. X         (math-neg (calcFunc-besJ (math-neg v) x))
  1595. X           (calcFunc-besJ (math-neg v) x)))
  1596. X        ((eq v 0)
  1597. X         (math-besJ0 x))
  1598. X        ((eq v 1)
  1599. X         (math-besJ1 x))
  1600. X        ((Math-lessp v (math-abs-approx x))
  1601. X         (let ((j 0)
  1602. X           (bjm (math-besJ0 x))
  1603. X           (bj (math-besJ1 x))
  1604. X           (two-over-x (math-div 2 x))
  1605. X           bjp)
  1606. X           (while (< (setq j (1+ j)) v)
  1607. X         (setq bjp (math-sub (math-mul (math-mul j two-over-x) bj)
  1608. X                     bjm)
  1609. X               bjm bj
  1610. X               bj bjp))
  1611. X           bj))
  1612. X        (t
  1613. X         (if (Math-lessp 100 v) (math-reject-arg v 'range))
  1614. X         (let* ((j (logior (+ v (math-isqrt-small (* 40 v))) 1))
  1615. X            (two-over-x (math-div 2 x))
  1616. X            (jsum nil)
  1617. X            (bjp '(float 0 0))
  1618. X            (sum '(float 0 0))
  1619. X            (bj '(float 1 0))
  1620. X            bjm ans)
  1621. X           (while (> (setq j (1- j)) 0)
  1622. X         (setq bjm (math-sub (math-mul (math-mul j two-over-x) bj)
  1623. X                     bjp)
  1624. X               bjp bj
  1625. X               bj bjm)
  1626. X         (if (> (nth 2 (math-abs-approx bj)) 10)
  1627. X             (setq bj (math-mul bj '(float 1 -10))
  1628. X               bjp (math-mul bjp '(float 1 -10))
  1629. X               ans (and ans (math-mul ans '(float 1 -10)))
  1630. X               sum (math-mul sum '(float 1 -10))))
  1631. X         (or (setq jsum (not jsum))
  1632. X             (setq sum (math-add sum bj)))
  1633. X         (if (= j v)
  1634. X             (setq ans bjp)))
  1635. X           (math-div ans (math-sub (math-mul 2 sum) bj)))))))
  1636. )
  1637. X
  1638. (defun math-besJ-series (sum term k zz vk)
  1639. X  (math-working "besJ" sum)
  1640. X  (setq k (1+ k)
  1641. X    vk (math-add 1 vk)
  1642. X    term (math-div (math-mul term zz) (math-mul k vk)))
  1643. X  (let ((next (math-add sum term)))
  1644. X    (if (math-nearly-equal next sum)
  1645. X    next
  1646. X      (math-besJ-series next term k zz vk)))
  1647. )
  1648. X
  1649. (defun math-besJ0 (x &optional yflag)
  1650. X  (cond ((and (not yflag) (math-negp (calcFunc-re x)))
  1651. X     (math-besJ0 (math-neg x)))
  1652. X    ((Math-lessp '(float 8 0) (math-abs-approx x))
  1653. X     (let* ((z (math-div '(float 8 0) x))
  1654. X        (y (math-sqr z))
  1655. X        (xx (math-add x '(float (bigneg 164 398 785) -9)))
  1656. X        (a1 (math-poly-eval y
  1657. X                    '((float (bigpos 211 887 093 2) -16)
  1658. X                      (float (bigneg 639 370 073 2) -15)
  1659. X                      (float (bigpos 407 510 734 2) -14)
  1660. X                      (float (bigneg 627 628 098 1) -12)
  1661. X                      (float 1 0))))
  1662. X        (a2 (math-poly-eval y
  1663. X                    '((float (bigneg 152 935 934) -16)
  1664. X                      (float (bigpos 161 095 621 7) -16)
  1665. X                      (float (bigneg 651 147 911 6) -15)
  1666. X                      (float (bigpos 765 488 430 1) -13)
  1667. X                      (float (bigneg 995 499 562 1) -11))))
  1668. X        (sc (math-sin-cos-raw xx)))
  1669. X           (if yflag
  1670. X           (setq sc (cons (math-neg (cdr sc)) (car sc))))
  1671. X           (math-mul (math-sqrt
  1672. X              (math-div '(float (bigpos 722 619 636) -9) x))
  1673. X             (math-sub (math-mul (cdr sc) a1)
  1674. X                   (math-mul (car sc) (math-mul z a2))))))
  1675. X     (t
  1676. X      (let ((y (math-sqr x)))
  1677. X        (math-div (math-poly-eval y
  1678. X                      '((float (bigneg 456 052 849 1) -7)
  1679. X                    (float (bigpos 017 233 739 7) -5)
  1680. X                    (float (bigneg 418 442 121 1) -2)
  1681. X                    (float (bigpos 407 196 516 6) -1)
  1682. X                    (float (bigneg 354 590 362 13) 0)
  1683. X                    (float (bigpos 574 490 568 57) 0)))
  1684. X              (math-poly-eval y
  1685. X                      '((float 1 0)
  1686. X                    (float (bigpos 712 532 678 2) -7)
  1687. X                    (float (bigpos 853 264 927 5) -5)
  1688. X                    (float (bigpos 718 680 494 9) -3)
  1689. X                    (float (bigpos 985 532 029 1) 0)
  1690. X                    (float (bigpos 411 490 568 57) 0)))))))
  1691. )
  1692. X
  1693. (defun math-besJ1 (x &optional yflag)
  1694. X  (cond ((and (math-negp (calcFunc-re x)) (not yflag))
  1695. X     (math-neg (math-besJ1 (math-neg x))))
  1696. X    ((Math-lessp '(float 8 0) (math-abs-approx x))
  1697. X     (let* ((z (math-div '(float 8 0) x))
  1698. X        (y (math-sqr z))
  1699. X        (xx (math-add x '(float (bigneg 491 194 356 2) -9)))
  1700. X        (a1 (math-poly-eval y
  1701. X                    '((float (bigneg 019 337 240) -15)
  1702. X                      (float (bigpos 174 520 457 2) -15)
  1703. X                      (float (bigneg 496 396 516 3) -14)
  1704. X                      (float 183105 -8)
  1705. X                      (float 1 0))))
  1706. X        (a2 (math-poly-eval y
  1707. X                    '((float (bigpos 412 787 105) -15)
  1708. X                      (float (bigneg 987 228 88) -14)
  1709. X                      (float (bigpos 096 199 449 8) -15)
  1710. X                      (float (bigneg 873 690 002 2) -13)
  1711. X                      (float (bigpos 995 499 687 4) -11))))
  1712. X        (sc (math-sin-cos-raw xx)))
  1713. X       (if yflag
  1714. X           (setq sc (cons (math-neg (cdr sc)) (car sc)))
  1715. X         (if (math-negp x)
  1716. X         (setq sc (cons (math-neg (car sc)) (math-neg (cdr sc))))))
  1717. X       (math-mul (math-sqrt (math-div '(float (bigpos 722 619 636) -9) x))
  1718. X             (math-sub (math-mul (cdr sc) a1)
  1719. X                   (math-mul (car sc) (math-mul z a2))))))
  1720. X    (t
  1721. X     (let ((y (math-sqr x)))
  1722. X       (math-mul
  1723. X        x
  1724. X        (math-div (math-poly-eval y
  1725. X                      '((float (bigneg 606 036 016 3) -8)
  1726. X                    (float (bigpos 826 044 157) -4)
  1727. X                    (float (bigneg 439 611 972 2) -3)
  1728. X                    (float (bigpos 531 968 423 2) -1)
  1729. X                    (float (bigneg 235 059 895 7) 0)
  1730. X                    (float (bigpos 232 614 362 72) 0)))
  1731. X              (math-poly-eval y
  1732. X                      '((float 1 0)
  1733. X                    (float (bigpos 397 991 769 3) -7)
  1734. X                    (float (bigpos 394 743 944 9) -5)
  1735. X                    (float (bigpos 474 330 858 1) -2)
  1736. X                    (float (bigpos 178 535 300 2) 0)
  1737. X                    (float (bigpos 442 228 725 144)
  1738. X                           0))))))))
  1739. )
  1740. X
  1741. (defun calcFunc-besY (v x)
  1742. X  (math-inexact-result)
  1743. X  (or (math-numberp v) (math-reject-arg v 'numberp))
  1744. X  (or (math-numberp x) (math-reject-arg x 'numberp))
  1745. X  (let ((calc-internal-prec (min 8 calc-internal-prec)))
  1746. X    (math-with-extra-prec 3
  1747. X      (setq x (math-float (math-normalize x)))
  1748. X      (setq v (math-float (math-normalize v)))
  1749. X      (cond ((not (math-num-integerp v))
  1750. X         (let ((sc (math-sin-cos-raw (math-mul v (math-pi)))))
  1751. X           (math-div (math-sub (math-mul (calcFunc-besJ v x) (cdr sc))
  1752. X                   (calcFunc-besJ (math-neg v) x))
  1753. X             (car sc))))
  1754. X        ((math-negp (setq v (math-trunc v)))
  1755. X         (if (math-oddp v)
  1756. X         (math-neg (calcFunc-besY (math-neg v) x))
  1757. X           (calcFunc-besY (math-neg v) x)))
  1758. X        ((eq v 0)
  1759. X         (math-besY0 x))
  1760. X        ((eq v 1)
  1761. X         (math-besY1 x))
  1762. X        (t
  1763. X         (let ((j 0)
  1764. X           (bym (math-besY0 x))
  1765. X           (by (math-besY1 x))
  1766. X           (two-over-x (math-div 2 x))
  1767. X           byp)
  1768. X           (while (< (setq j (1+ j)) v)
  1769. X         (setq byp (math-sub (math-mul (math-mul j two-over-x) by)
  1770. X                     bym)
  1771. X               bym by
  1772. SHAR_EOF
  1773. true || echo 'restore of calc-funcs.el failed'
  1774. fi
  1775. echo 'End of  part 16'
  1776. echo 'File calc-funcs.el is continued in part 17'
  1777. echo 17 > _shar_seq_.tmp
  1778. exit 0
  1779. exit 0 # Just in case...
  1780. -- 
  1781. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  1782. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  1783. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  1784. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  1785.